package com.mongo.utils;

import cn.hutool.core.util.StrUtil;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class TxtFileSplitter {

    public static void main(String[] args) {
        // 原始文件路径（请替换为实际路径）
        String parentDir = "D:\\work\\doc\\多组学数据库\\Network\\";
        String sourceFilePath = parentDir + "Coexpression-data.txt";

        // 拆分后文件的输出目录（请替换为实际目录，默认当前目录可改为""）
        String outputDir = parentDir + "split_files";
        // 每个子文件最多包含的记录行数（不含表头）
        int maxRecordsPerFile = 200000;

        try {
            System.out.println("===== 开始处理 =====");
            // 直接处理并拆分，无需临时文件，减少中间环节
            processAndSplit(sourceFilePath, outputDir, maxRecordsPerFile);
            System.out.println("===== 所有处理完成 =====");

        } catch (IOException e) {
            System.err.println("处理失败: " + e.getMessage());
            e.printStackTrace();
        }


    }

    /**
     * 合并添加_id和拆分文件的逻辑，避免临时文件导致的信息丢失
     */
    private static void processAndSplit(String sourcePath, String outputDir, int maxRecords) throws IOException {
        // 提取源文件名（用于子文件命名）
        File sourceFile = new File(sourcePath);
        String sourceFileName = sourceFile.getName();
        int suffixIndex = sourceFileName.lastIndexOf(".");
        String baseName = (suffixIndex > 0) ? sourceFileName.substring(0, suffixIndex) : sourceFileName;

        // 创建输出目录
        if (!outputDir.isEmpty()) {
            File dir = new File(outputDir);
            if (!dir.exists()) {
                dir.mkdirs();
            }
        }

        try (BufferedReader br = new BufferedReader(new FileReader(sourcePath))) {
            // 读取原始表头
            String originalHeader = br.readLine();
            if (originalHeader == null) {
                System.out.println("原始文件为空，无数据可处理");
                return;
            }
            originalHeader = originalHeader.replaceAll("\"", "");//去掉第一行各列名里包含的双引号
            // 构建带_id的新表头
            String newHeader = "_id\t" + originalHeader;

            List<String> records = new ArrayList<>();
            String line;
            int lineNumber = 1; // _id从1开始编号
            int fileIndex = 1;
            int recordCount = 0;

            // 读取数据行并处理
            while ((line = br.readLine()) != null) {
                // 直接在内存中构建带_id的行
                line = line.replaceAll("\"", "");//去掉第一行各列名里包含的双引号
                String lineWithId = lineNumber + "\t" + line;
                records.add(lineWithId);
                recordCount++;
                lineNumber++;

                // 达到最大行数时写入子文件
                if (recordCount >= maxRecords) {
                    writeSplitFile(outputDir, baseName, fileIndex, newHeader, records);
                    records.clear();
                    recordCount = 0;
                    fileIndex++;
                }
            }

            // 处理剩余数据
            if (!records.isEmpty()) {
                writeSplitFile(outputDir, baseName, fileIndex, newHeader, records);
            }

            System.out.println("共生成 " + fileIndex + " 个子文件，均包含_id列");
        }
    }

    /**
     * 写入拆分文件（确保表头和数据都包含_id）
     */
    private static void writeSplitFile(String outputDir, String baseName, int fileIndex, String header, List<String> records) throws IOException {
        // 构建文件名：源文件名_序号.txt
        String fileName = outputDir + (outputDir.isEmpty() ? "" : "/") + baseName + "_" + fileIndex + ".txt";

        try (BufferedWriter bw = new BufferedWriter(new FileWriter(fileName))) {
            // 写入带_id的表头
            bw.write(header);
            bw.newLine();
            // 写入带_id的数据行
            for (String record : records) {
                bw.write(record);
                bw.newLine();
            }
        }
        System.out.println("生成子文件: " + fileName + "（包含_id列，数据行数: " + records.size() + "）");
    }
}
